﻿using System.Collections.Generic;
using System.Linq;
using CRM.Database.Model;

namespace CRM.Models
{
    public static class PermissionsManager
    {   
        /// <summary>
        /// Проверка доступа на основе контроллера, действия и пользователя
        /// </summary>
        /// <param name="controller">контроллер</param>
        /// <param name="action">действие</param>
        /// <param name="user">пользователь Windows</param>
        /// <returns>true или fasle</returns>
        public static bool ValidatePermissions(string controller, string action, string user)
        {
           var useCol = new UsersCollection();
            Users usr = useCol.GetUserByLogin(user) as CRM.Database.Model.Users;
            //первичная проверка на админа
            if (usr != null && usr.IsInRoleType(1))
                return true;

            bool userHasAccess = false;
            if(IsControllerAndActionExist(controller,action))
            {
                List<CRM.Database.Model.Roles> rolesList = usr.Roles;
                var col = new ControllersAndActionsCollection();
                int idActionController =col.GetControllersAndActionsIdByControllerAndAction(controller, action);
                if (rolesList != null && idActionController != 0)
                {
                    foreach (var role in rolesList)
                    {
                        if (role != null)
                            foreach (var item in role.RolesAccesses)
                            {
                                if (item.IdControllersAndAction == idActionController)
                                    userHasAccess = true;
                            }
                    }
                }
            }
            return userHasAccess;
        }

        /// <summary>
        /// Проверка доступа на основе контроллера, действия, пользователя и идентификатора клиента. 
        /// Проверяет принадлежность пользователя Windows и клиента к одному региону профайн.
        /// </summary>
        /// <param name="controller">контроллер</param>
        /// <param name="action">действие</param>
        /// <param name="user">пользователь Windows</param>
        /// <param name="idCustomer">идентификатор клиента</param>
        /// <returns>Есть доступ или нет</returns>
        public static bool ValidatePermissions(string controller, string action, string user, int idCustomer)
        {
            var useCol = new UsersCollection();
            CRM.Database.Model.Users usr = useCol.GetUserByLogin(user) as CRM.Database.Model.Users;
            //первичная проверка на админа
            if (usr != null && usr.IsInRoleType(1))
                return true;

            //if (DB.IsUserInRoleType(3, user))
            //    return true;
            //см сетод: ValidateUserAndTurnover

            if (!ValidateUserAndCustomersProfileRegion(idCustomer, user))
                return false;
            return ValidatePermissions(controller, action, user);
        }

        /// <summary>
        /// проверяет наличие контроллера и действия в справочнике. Если не находит, то добавляет и возвращяет false. Если находит - true.
        /// </summary>
        /// <param name="controller">Имя контроллера из контекста</param>
        /// <param name="action">Имя действия из контекста</param>
        /// <returns></returns>
        public static bool IsControllerAndActionExist(string controller, string action)
        {
            if (!string.IsNullOrEmpty(controller) && !string.IsNullOrEmpty(action))
            {
                var col = new ControllersAndActionsCollection();
                foreach (var controllersAndActionIten in col.ControllersAndActionsList)
                {
                    if (controllersAndActionIten.Controller == controller &&
                        controllersAndActionIten.Action == action)
                       return true;
                }
                CRM.Database.Model.ControllersAndActions controllersAndAction = new CRM.Database.Model.ControllersAndActions();
                controllersAndAction.Controller = controller;
                controllersAndAction.Action = action;
                col.Add(controllersAndAction,"max");
                return true;
            }
            return false;
        }

        /// <summary>
        /// поиск совпадения идентификаторов региона профайн в ролях пользователя с идентификатором региона
        /// профайн в получанном клиенте
        /// </summary>
        /// <param name="idCustomer"></param>
        /// <param name="user"></param>
        /// <returns></returns>
        public static bool ValidateUserAndCustomersProfileRegion(int idCustomer, string user)
        {
            var col = new RolesCollection();
            //список ролей, которым принадлежит пользователь Windows
            List<Database.Model.Roles> rolesList = col.GetRolesByUserLoginname(user);
            //клиент профайн, идентификатор которого передается в метод
            var col1 = new CustomersCollection();
            Customers customer = col1.GetItemById(idCustomer) as Customers;
            //поиск совпадения идентификаторов региона профайн в ролях пользователя с идентификатором региона 
            //профайн в получанном клиенте
            if (rolesList != null && customer != null)
            {
                foreach (var roleItem in rolesList)
                {
                    if (roleItem.profineRegions != null)
                    {
                        //если регион роли совпадает с регионом клиента или с регионом "Все регионы"  
                        if (roleItem.profineRegions.IdProfineRegion == customer.IdprofineRegion || roleItem.profineRegions.IdProfineRegion == 25)
                            return true;
                    }
                   //if ((roleItem.profineRegions != null && roleItem.profineRegions.IdProfineRegion == customer.IdprofineRegion))
                   //     return true;
                }
            }
            return false;
        }

        /// <summary>
        /// Проверяет может ли пользователь видеть оборот на основании своего региона 
        /// </summary>
        /// <param name="user">пользователь Windows</param>
        /// <param name="turnoverItem">оборот</param>
        /// <returns>ДА или НЕТ</returns>
        public static bool ValidateUserAndTurnover(string user, Database.Model.v_TrueTurnovers turnoverItem)
        {
            var col = new UsersCollection();
            Users _user = col.GetUserByLogin(user);


            return ValidateUserAndTurnover(_user, turnoverItem);
        }


        /// <summary>
        /// Проверяет может ли пользователь видеть оборот на основании своего региона 
        /// </summary>
        /// <param name="user">пользователь Windows</param>
        /// <param name="turnoverItem">оборот</param>
        /// <returns>ДА или НЕТ</returns>
        public static bool ValidateUserAndTurnover(string user, Database.Model.Turnovers turnoverItem)
        {
            var col = new UsersCollection();
            Database.Model.Users _user = col.GetUserByLogin(user);


            return ValidateUserAndTurnover(_user, turnoverItem);
        }


        /// <summary>
        /// Проверка разрешения пользователя на просмотр оборота
        /// </summary>
        /// <param name="user">Пользователь</param>
        /// <param name="turnoverItem">Оборот</param>
        /// <returns>Результат проверки</returns>
        public static bool ValidateUserAndTurnover(CRM.Database.Model.Users user, CRM.Database.Model.v_TrueTurnovers turnoverItem)
        {


            //первичная проверка на админа
            if (user.IsInRoleType(1))
                return true;

            //проверка на НЕотображение оборота техникам
            if (user.IsInRoleType(3))
                return false;

           

            Database.Model.Users _user = user;
            foreach (var item in _user.UsersInRoles)
            {
                if (item.Roles.IdProfineRegion == turnoverItem.IdProfineRegion)
                {
                    return true;
                }
            }

            return false;
        }

        /// <summary>
        /// Проверка разрешения пользователя на просмотр оборота
        /// </summary>
        /// <param name="user">Пользователь</param>
        /// <param name="turnoverItem">Оборот</param>
        /// <returns>Результат проверки</returns>
        public static bool ValidateUserAndTurnover(CRM.Database.Model.Users user, CRM.Database.Model.Turnovers turnoverItem)
        {


            //первичная проверка на админа
            if (user.IsInRoleType(1))
                return true;

            //проверка на НЕотображение оборота техникам
            if (user.IsInRoleType(3))
                return false;



            Database.Model.Users _user = user;
            foreach (var item in _user.UsersInRoles)
            {
                if (item.Roles.IdProfineRegion == turnoverItem.IdProfineRegion)
                {
                    return true;
                }
            }

            return false;
        }

        
        /// <summary>
        /// Получение оборотов по пользователю
        /// </summary>
        /// <param name="userName">Логин пользователя</param>
        /// <returns>Список оборотов</returns>
        public static List<CRM.Database.Model.v_TrueTurnovers> GetTrueTurnoversByUserName(string userName)
        {
            var col = new TurnoversCollection();
           

              return col.TrueTurnovers.Where(turnover => ValidateUserAndTurnover(userName, turnover)).ToList();
        }



        /// <summary>
        /// Получение всех прямых оборотов, отфильтрованных по пользователю
        /// </summary>
        /// <param name="userName">Логин пользователя</param>
        /// <returns>Список прямых оборотов</returns>
        public static List<CRM.Database.Model.Turnovers> GetAllDirectTurnoversFilteredByUserAccess(string userName)
        {
            var col = new TurnoversCollection();
            return col.TurnoversList.Where(c => c.IdTurnoverClassification == 3).Where(turnover => ValidateUserAndTurnover(userName, turnover)).ToList();
        } 


        public static List<CRM.Database.Model.v_TrueTurnovers> GetNovisesFilteredByUserAccess(string userName)
        {
            var col = new TurnoversCollection();

            return col.GetNoviciesTurnovers().Where(item => ValidateUserAndTurnover(userName, item)).ToList();
        }
    }
}

//старый ValidatePermissions
//bool userHasAccess = false;
////список ролей, которым принадлежит пользователь Windows
//List<Roles> rolesList = DB.GetRolesByUserLoginname(user);
/////клиент профайн, идентификатор которого передается в метод
//Customers customer = DB.GetCustomerById(idCustomer);
////поиск совпадения идентификаторов региона профайн в ролях пользователя с идентификатором региона 
////профайн в получанном клиенте
//if(rolesList != null && customer != null)
//{
//    foreach (var roleItem in rolesList)
//    {
//        if (customer.profineRegions != null && (roleItem.profineRegions != null && roleItem.profineRegions.IdProfineRegion == customer.profineRegions.IdProfineRegion))
//            userHasAccess = true;
//    }
//}
//